/**
 * @brief   RUDP客户端实现模块。
 * @version 1.0
 * @date    2018-3-2
 * @author  宋炜
*/

#ifndef __RDUP_CLIENT_HPP__
#define __RDUP_CLIENT_HPP__
#include <string>
#include <atomic>
#include <uv.h>
#include "base.hpp"
#include "timer.hpp"

class rudpClient : public rudp
{
public:
private:
	std::function< void ( struct addrinfo * )> on_resolv_cb;
	rudp_buf_t              multi_pk_buf;                  // 多包的数据缓冲	
private:
        virtual void do_on_close_echo( rudp_pkge_t * pkge , const struct sockaddr * add );
        virtual void do_on_close( rudp_pkge_t * pkge , const struct sockaddr * peer );
	virtual void do_on_send( rudp_pkge_t * pkge , const struct sockaddr * add );
        virtual void do_on_connect_echo( rudp_pkge_t * pkge , const struct sockaddr * peer );
        virtual void do_on_connect( rudp_pkge_t * pkge , const struct sockaddr * add );

public:
	/**
	 * 构造对象
	 */
	rudpClient();
	rudpClient( const std::string& url , int port );
	virtual ~rudpClient();
	
	/**
	 * @brief 连接服务器
	 * @param url
	 * @param port
	 * @return 
	 */
	void Connect( const std::string& url , int port );
        void Connect( const std::string& url , int port , std::function< void (err_code) > cb );
	/**
	 */
        void close();
	err_code Close();
	err_code evtClose( std::function<void(err_code)> cb );
	/**
	 * @brief 设置连接事件响应处理函数
	 */
	err_code evtConnected( std::function< void ( err_code )> cb );
	/**
	 * @brief 发送数据
	 */
	err_code Send( const char * data , size_t len );
	/**
	 * @brief 
	 */
	void evtSend( std::function<void ( err_code ) > cb );
	/**
	 * @brief 设置接收回调函数
	 */
	err_code evtRecv( std::function<void ( const char * , size_t , err_code )> cb );
};
#endif
